import mongoose, { Document, Schema, Model } from 'mongoose';

/**
 * 权限模板接口定义
 * 用于定义可重用的权限配置模板
 */
export interface IPermissionTemplate extends Document {
  /** 模板名称 */
  name: string;
  /** 模板描述 */
  description?: string;
  /** 模板类型：role-角色模板，organization-组织模板，user-用户模板 */
  type: 'role' | 'organization' | 'user';
  /** 权限ID列表 */
  permissionIds: mongoose.Types.ObjectId[];
  /** 角色ID列表（可选，用于角色模板） */
  roleIds?: mongoose.Types.ObjectId[];
  /** 模板状态：active-激活，inactive-未激活 */
  status: 'active' | 'inactive';
  /** 创建者ID */
  createdBy: mongoose.Types.ObjectId;
  /** 更新者ID */
  updatedBy?: mongoose.Types.ObjectId;
  /** 创建时间 */
  createdAt: Date;
  /** 更新时间 */
  updatedAt: Date;
}

/**
 * 权限模板模型静态方法接口
 */
export interface IPermissionTemplateModel extends Model<IPermissionTemplate> {
  /**
   * 根据名称查找权限模板
   * @param name 模板名称
   * @returns 权限模板文档或null
   */
  findByName(name: string): Promise<IPermissionTemplate | null>;
  
  /**
   * 根据类型查找权限模板
   * @param type 模板类型
   * @returns 权限模板文档数组
   */
  findByType(type: 'role' | 'organization' | 'user'): Promise<IPermissionTemplate[]>;
  
  /**
   * 根据创建者查找权限模板
   * @param createdBy 创建者ID
   * @returns 权限模板文档数组
   */
  findByCreator(createdBy: mongoose.Types.ObjectId): Promise<IPermissionTemplate[]>;
}

/**
 * 权限模板数据库模式定义
 */
const PermissionTemplateSchema = new Schema<IPermissionTemplate>({
  // 模板名称：必填，唯一
  name: {
    type: String,
    required: [true, '模板名称不能为空'],
    unique: true,
    trim: true,
    maxlength: [100, '模板名称最多100个字符']
  },
  
  // 模板描述：可选
  description: {
    type: String,
    trim: true,
    maxlength: [500, '模板描述最多500个字符']
  },
  
  // 模板类型：必填
  type: {
    type: String,
    required: [true, '模板类型不能为空'],
    enum: {
      values: ['role', 'organization', 'user'],
      message: '模板类型必须是 role、organization 或 user'
    }
  },
  
  // 权限ID列表：必填
  permissionIds: [{
    type: Schema.Types.ObjectId,
    ref: 'Permission',
    required: true
  }],
  
  // 角色ID列表：可选
  roleIds: [{
    type: Schema.Types.ObjectId,
    ref: 'Role'
  }],
  
  // 模板状态：默认为active
  status: {
    type: String,
    enum: {
      values: ['active', 'inactive'],
      message: '模板状态必须是 active 或 inactive'
    },
    default: 'active'
  },
  
  // 创建者ID：必填
  createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'User',
    required: [true, '创建者不能为空']
  },
  
  // 更新者ID：可选
  updatedBy: {
    type: Schema.Types.ObjectId,
    ref: 'User'
  }
}, {
  // 自动添加创建时间和更新时间
  timestamps: true,
  // 转换为JSON时的配置
  toJSON: {
    transform: function(doc, ret) {
      return ret;
    }
  }
});

/**
 * 根据名称查找权限模板
 * @param name 模板名称
 * @returns 权限模板文档或null
 */
PermissionTemplateSchema.statics.findByName = function(name: string): Promise<IPermissionTemplate | null> {
  return this.findOne({ name }).populate('permissionIds roleIds createdBy updatedBy');
};

/**
 * 根据类型查找权限模板
 * @param type 模板类型
 * @returns 权限模板文档数组
 */
PermissionTemplateSchema.statics.findByType = function(type: 'role' | 'organization' | 'user'): Promise<IPermissionTemplate[]> {
  return this.find({ type, status: 'active' }).populate('permissionIds roleIds createdBy updatedBy');
};

/**
 * 根据创建者查找权限模板
 * @param createdBy 创建者ID
 * @returns 权限模板文档数组
 */
PermissionTemplateSchema.statics.findByCreator = function(createdBy: mongoose.Types.ObjectId): Promise<IPermissionTemplate[]> {
  return this.find({ createdBy }).populate('permissionIds roleIds createdBy updatedBy');
};

// 创建并导出权限模板模型
export const PermissionTemplate = mongoose.model<IPermissionTemplate, IPermissionTemplateModel>('PermissionTemplate', PermissionTemplateSchema);

export default PermissionTemplate;